home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Boxer / PQAnywhere / pqany.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-23  |  5.8 KB  |  292 lines

  1. #define IGNORE_STDIO_STUBS
  2. #define __string_h
  3.  
  4. #ifdef OLDGCC
  5.  
  6. #include <Common.h>
  7. #include <System/SysAll.h>
  8. #include <UI/UIAll.h>
  9. #include <Unix/sys_types.h>
  10.  
  11. #else
  12.  
  13. #include <PalmOS.h>
  14. #include <PalmCompatibility.h>
  15. #include <Unix/sys_types.h>
  16.  
  17. #endif
  18.  
  19. #include "stringil.h"
  20. #include "stdio2.h"
  21.  
  22.  
  23. char pqahead[] = {
  24.   'l', 'n', 'c', 'h',
  25.   0, 3, 0x80, 1,
  26.   0, 1, '1', 0,                 // len/2, version
  27.   0, 1, 'X', 0,                 // len/2, Title
  28.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  29.   0, 0,                         // len/2, icon
  30.   0, 0                          // len/2, smallicon
  31. };
  32.  
  33. char pqatwo[] = {
  34.   0, 0, 0, 16,                  /*url offset */
  35.   0, 1,                         /* url length */
  36.   0, 0, 0, 18,                  /*html offset */
  37.   0, 1,                         /* html length */
  38.   4, 1,                         /* content, compression */
  39.   0, 0,
  40.   'X', 0,
  41. };
  42.  
  43. char bbuf[512];
  44.  
  45. char *d;
  46. int len, count;
  47.  
  48. void putbits(int i, unsigned long val)
  49. {
  50.   while (--i >= 0) {
  51.     if ((1 << i) & (val))
  52.       *d |= 1 << count;
  53.     if (count-- == 0) {
  54.       count = 7;
  55.       len++;
  56.       d++;
  57.     }
  58.   }
  59. }
  60.  
  61. void putstring(char *c)
  62. {
  63.   while (*c) {
  64.     if (*c >= 'a' && *c <= 'z')
  65.       putbits(5, *c + 6 - 'a');
  66.     else if (*c == ' ')
  67.       putbits(5, 5);
  68.     else {
  69.       putbits(5, 2);
  70.       putbits(8, *c);
  71.     }
  72.     c++;
  73.   }
  74. }
  75.  
  76. LocalID lid;
  77.  
  78. int MakePQA(char *url, char *title, int img)
  79. {
  80.   LocalID aiid;
  81.   UInt16 num, attr;
  82.   UInt32 asz;
  83.   DmOpenRef db;
  84.   void *ap, *xp;
  85.  
  86.   lid = DmFindDatabase(0, title);
  87.   if (lid)
  88.     DmDeleteDatabase(0, lid);
  89.   DmCreateDatabase(0, title, 'clpr', 'pqa ', 0);
  90.   lid = DmFindDatabase(0, title);
  91.   attr = 0x200;
  92.   DmSetDatabaseInfo(0, lid, NULL, &attr, NULL, NULL, NULL,
  93.                     NULL, NULL, NULL, NULL, NULL, NULL);
  94.   WinDrawChars("/", 1, 150, 0);
  95.   db = DmOpenDatabase(0, lid, dmModeReadWrite);
  96.  
  97.   if( !strcmp( &title[strlen(title)-4],".pqa") )
  98.     title[strlen(title)-4] = 0;
  99.   if( !strcmp( &title[strlen(title)-4],".PQA") )
  100.     title[strlen(title)-4] = 0;
  101.  
  102.   asz = 50;
  103.   ap = DmNewHandle(db, asz);
  104.   aiid = MemHandleToLocalID(ap);
  105.   xp = MemHandleLock(ap);
  106.   pqahead[13] = ( strlen(title) + 1 ) / 2;
  107.   strcpy(&pqahead[14],title);
  108.   DmWrite(xp, 0, pqahead, asz);
  109.  
  110.   MemHandleUnlock(ap);
  111.   DmSetDatabaseInfo(0, lid, NULL, NULL, NULL, NULL, NULL, NULL,
  112.                     NULL, &aiid, NULL, NULL, NULL);
  113.  
  114.   num = 0xffff;
  115.   ap = DmNewRecord(db, &num, 1024);
  116.   xp = MemHandleLock(ap);
  117.  
  118.   memset(bbuf, 0, 512);
  119.  
  120.   d = bbuf;
  121.   count = 7;
  122.   len = 1;
  123.  
  124.   putstring(title);        //title
  125.   putbits(5, 0);
  126.  
  127.   if( !img ) {
  128.     putbits(5, 1);                //Link
  129.     putbits(8, 17);
  130.     putbits(2, 0);
  131.     putbits(8, 0x21);
  132.  
  133.     putstring(url);               //URL
  134.     putbits(5, 0);
  135.  
  136.     putstring("go");              //button
  137.     putbits(5, 0);
  138.   } else {
  139.  
  140.     putbits(5, 1);                //Img URL
  141.     putbits(8, 0x34);
  142.     putbits(8, 0x20);
  143.  
  144.     putstring(url);               //URL
  145.     putbits(5, 0);
  146.   }
  147.  
  148.   putbits(5, 1);                //EOPQA
  149.   putbits(8, 0x71);
  150.  
  151.   pqatwo[11] = len + 6;
  152.  
  153.   DmWrite(xp, 0, pqatwo, 18);
  154.   DmWrite(xp, 18, bbuf, len);
  155.  
  156.   MemHandleUnlock(ap);
  157.   DmResizeRecord(db, num, len + 18);
  158.   DmReleaseRecord(db, num, false);
  159.   DmCloseDatabase(db);
  160.   return 0;
  161. }
  162.  
  163. FormPtr form = NULL;
  164.  
  165. int exitflg;
  166. char *desturl[512];
  167. Boolean handleit(EventPtr event)
  168. {
  169.   FieldPtr tf1;
  170.   VoidHand tf2;
  171.   unsigned char *tp1,*tp2;
  172.   unsigned int eid;
  173.  
  174.   switch (event->eType) {
  175.  
  176.   case frmOpenEvent:
  177.     tf2 = MemHandleNew(120);
  178.     tp1 = MemHandleLock(tf2);
  179.     strcpy(tp1, "http://www..com/~");
  180.     MemHandleUnlock(tf2);
  181.     tf1 = FrmGetObjectPtr(form, FrmGetObjectIndex(form, 1001));
  182.     FldSetTextHandle(tf1, tf2);
  183.  
  184.     tf2 = MemHandleNew(32);
  185.     tp1 = MemHandleLock(tf2);
  186.     strcpy(tp1, "MyNewPQA.pqa");
  187.     MemHandleUnlock(tf2);
  188.     tf1 = FrmGetObjectPtr(form, FrmGetObjectIndex(form, 1010));
  189.     FldSetTextHandle(tf1, tf2);
  190.  
  191.     FrmDrawForm(form);
  192.     FrmSetFocus(form, FrmGetObjectIndex(form, 1001));
  193.     return 1;
  194.   case ctlSelectEvent:
  195.  
  196.     eid = event->data.ctlEnter.controlID;
  197.  
  198.     /* process form */
  199.  
  200.     if (eid == 1004 || eid == 1007) {
  201.  
  202.       tf1 = FrmGetObjectPtr(form, FrmGetObjectIndex(form, 1001));
  203.       tp1 = FldGetTextPtr(tf1);
  204.  
  205.       tf2 = FrmGetObjectPtr(form, FrmGetObjectIndex(form, 1010));
  206.       tp2 = FldGetTextPtr(tf2);
  207.  
  208.       MakePQA(tp1, tp2, eid != 1004);
  209.       exitflg = 2;
  210.  
  211.     }
  212.  
  213.     if (eid == 1005)
  214.       exitflg = 1;
  215.  
  216.     if (eid == 1006) {
  217.  
  218.       tf1 = FrmGetObjectPtr(form, FrmGetObjectIndex(form, 1001));
  219.       tp1 = FldGetTextPtr(tf1);
  220.       strcpy( desturl, tp1 );
  221.       exitflg = 3;
  222.  
  223.     }
  224.  
  225.     return 1;
  226.   default:
  227.     return 0;
  228.   }
  229.   return 0;
  230. }
  231.  
  232.  
  233. DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
  234. {
  235.   EventType event;
  236.   Err err;
  237.   int formID;
  238.  
  239.   if (cmd != sysAppLaunchCmdNormalLaunch)
  240.     return 0;
  241.  
  242.   FrmGotoForm(1000);
  243.   exitflg = 0;
  244.  
  245.   do {
  246.     EvtGetEvent(&event, -1);
  247.  
  248.     if (event.eType == nilEvent)
  249.       continue;
  250.  
  251.     if (SysHandleEvent(&event))
  252.       continue;
  253.     if (MenuHandleEvent((void *) 0, &event, &err))
  254.       continue;
  255.  
  256.     if (event.eType == frmLoadEvent) {
  257.       formID = event.data.frmLoad.formID;
  258.       form = FrmInitForm(formID);
  259.       FrmSetActiveForm(form);
  260.       FrmSetEventHandler(form, (FormEventHandlerPtr) handleit);
  261.     }
  262.     if (form)
  263.       FrmDispatchEvent(&event);
  264.   }
  265.   while (event.eType != appStopEvent && !exitflg);
  266.  
  267.  
  268.   if (exitflg == 2) {
  269.     struct {
  270.       UInt16 cn;
  271.       LocalID li;
  272.     } *x;
  273.     x = MemPtrNew(sizeof(*x));
  274.     x->cn = 0;
  275.     x->li = lid;
  276.     MemPtrSetOwner(x, 0);
  277.     lid = DmFindDatabase(0, "Clipper");
  278.     SysUIAppSwitch(0, lid, sysAppLaunchCmdOpenDB, x);
  279.   }
  280.  
  281.   if (exitflg == 3) {
  282.     char *x;
  283.     x = MemPtrNew(strlen(desturl)+1);
  284.     strcpy(x,desturl);
  285.     MemPtrSetOwner(x, 0);
  286.     lid = DmFindDatabase(0, "Clipper");
  287.     SysUIAppSwitch(0, lid, sysAppLaunchCmdGoToURL, x);
  288.   }
  289.  
  290.   return 0;
  291. }
  292.